/*
 * @Author: your name
 * @Date: 2021-04-18 12:01:14
 * @LastEditTime: 2021-04-18 12:56:23
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \ownership\src\main.rs
 */
// 引用& : 允许使用值但不获取其所有权
//         因为并不拥有这个值,当引用离开作用域时其指向的值也不会被丢弃。
// 借用mut&
//规则：要么 只能有一个可变引用，要么 只能有多个不可变引用

// slice 允许你引用集合中一段连续的元素序列，而不用引用整个集合。
fn change_string(s_string: &mut String) -> usize{
    s_string.push_str(" , world, xun");
    let length = s_string.len();
    length
}

fn copy_string(s:&String) -> &str {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }
    &s[..]
}
fn first_word_len(s:&String) -> usize {
    let as_byte = s.as_bytes();
    // 迭代器  这里iter方法返回集合每个元素到item：
    //         i 是索引而元组中的 &item 是单个字节
    for(i, &item) in as_byte.iter().enumerate(){
        if item == b' ' {
            return i;
        }
    }
    s.len()
}
fn main() {
    let mut s1 = String::from("hello");
    let len = change_string(&mut s1);
    println!("the new string is {}; len = {}", s1, len);

    let mut s2 = String::from("hahahahahahah is me");
    let firstword_len = first_word_len(&s2);
    println!("the first word len = {}", firstword_len);
    s2.clear();   // 清空字符串
    let len2 = change_string(&mut s2);
    println!("the new string2 is {}; len = {}", s2, len2);

    // string slice 
    let word = copy_string(&s1);
    let new_word = &s2[2..7];
    println!("the new_word is {},the copy word is {}", new_word, word);
    
    println!("Hello, world!");
    
}
